home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-08-16 | 5.2 KB | 200 lines | [TEXT/PJMM] |
- unit MyNewPreferences;
-
- interface
-
- uses
- MyCollections;
-
- var
- the_prefs_folder_vrn: integer;
- the_prefs_folder_dirID: longInt;
- prefs_fs: FSSPec;
- prefs: collection;
-
- procedure InitPreferences (strhId, folderindex, fileindex: integer; fcreator: OSType);
- procedure FinishPreferences;
- procedure WritePrefsData;
- procedure ReadPrefsData;
- procedure JustReadPrefsData;
- procedure ReadPrefsCollection (c: collection; res_id: integer);
- procedure WritePrefsCollection (c: collection; res_id: integer);
- procedure PutResource (h: handle; typ: ResType; id: integer); { handle remains unchanged, and is detatched }
- procedure ReadPrefsHandle (var h: handle; typ: ResType; id: integer);
- procedure WritePrefsHandle (h: handle; typ: ResType; id: integer);
-
- implementation
-
- uses
- Folders, AppleTalk, Aliases, MyFileSystemUtils, MyFDFlags;
-
- const
- prefs_restype = 'PRFN';
- prefs_resid = 128;
- prefs_type = 'pref';
-
- var
- prefs_creator: OSType;
- prefs_mdate: longInt;
-
- procedure ReadPrefsHandle (var h: handle; typ: ResType; id: integer);
- var
- resfile: integer;
- begin
- resfile := HOpenResFile(prefs_fs.vRefNum, prefs_fs.parID, prefs_fs.name, fsRdPerm);
- h := GetResource(typ, id);
- if h <> nil then begin
- DetachResource(h);
- end;
- if resfile <> -1 then
- CloseResFile(resfile);
- end;
-
- procedure ReadPrefsCollection (c: collection; res_id: integer);
- var
- h: handle;
- begin
- ReadPrefsHandle(h, prefs_restype, res_id);
- if h <> nil then begin
- HackUpdateHandleToCollection(h);
- c.SetDataHandle(h);
- end;
- end;
-
- procedure JustReadPrefsData;
- begin
- ReadPrefsCollection(prefs, prefs_resid);
- prefs.safeget := true;
- end;
-
- procedure PutResource (h: handle; typ: ResType; id: integer);
- var
- old: handle;
- xid: integer;
- xtyp: ResType;
- name: str255;
- begin
- name := '';
- old := Get1Resource(typ, id);
- if old <> nil then begin
- GetResInfo(old, xid, xtyp, name);
- RmveResource(old);
- DisposeHandle(old);
- end;
- AddResource(h, typ, id, name);
- WriteResource(h);
- DetachResource(h);
- end;
-
- procedure WritePrefsHandle (h: handle; typ: ResType; id: integer);
- var
- oe: OSErr;
- resfile: integer;
- begin
- oe := HCreate(prefs_fs.vRefNum, prefs_fs.parID, prefs_fs.name, prefs_creator, prefs_type);
- HCreateResFile(prefs_fs.vRefNum, prefs_fs.parID, prefs_fs.name);
- resfile := HOpenResFile(prefs_fs.vRefNum, prefs_fs.parID, prefs_fs.name, fsRdWrPerm);
- if resfile <> -1 then begin
- PutResource(h, typ, id);
- CloseResFile(resfile);
- end;
- end;
-
- procedure WritePrefsCollection (c: collection; res_id: integer);
- var
- oe: OSErr;
- resfile: integer;
- h: handle;
- begin
- h := c.GetDataHandle;
- WritePrefsHandle(h, prefs_restype, res_id);
- end;
-
- procedure WritePrefsData;
- begin
- WritePrefsCollection(prefs, prefs_resid);
- end;
-
- procedure ReadPrefsData;
- var
- nmoddate: longInt;
- begin
- MyGetModDate(prefs_fs, nmoddate);
- if nmoddate <> prefs_mdate then begin
- prefs_mdate := nmoddate;
- JustReadPrefsData;
- end;
- end;
-
- procedure FixPrefType;
- var
- fi: FInfo;
- err: OSErr;
- begin
- err := HGetFInfo(prefs_fs.vRefNum, prefs_fs.parID, prefs_fs.name, fi);
- if (err = noErr) & (fi.fdCreator = prefs_creator) & (fi.fdType <> prefs_type) then begin
- fi.fdType := prefs_type;
- fi.fdFlags := BAND(fi.fdFlags, BNOT(fdInited));
- err := HSetFInfo(prefs_fs.vRefNum, prefs_fs.parID, prefs_fs.name, fi);
- end;
- end;
-
- {$S Init}
- procedure InitPreferences (strhId, folderindex, fileindex: integer; fcreator: OSType);
- var
- gv: longInt;
- oe: OSErr;
- pb: CInfoPBRec;
- sysenv: SysEnvRec;
- name: str255;
- dummy: longInt;
- our_prefs_folder_vrn: integer;
- our_prefs_folder_dirID: longInt;
- begin
- new(prefs);
- prefs.Create(0, false, true);
- prefs.safeget := true;
- prefs_creator := fcreator;
-
- { First Find the Preferences Folder }
- if (Gestalt(gestaltFindFolderAttr, gv) <> noErr) | (not BTST(gv, gestaltFindFolderPresent)) | (FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder, the_prefs_folder_vrn, the_prefs_folder_dirID) <> NoErr) then begin
- oe := SysEnvirons(1, sysenv);
- the_prefs_folder_vrn := sysenv.sysVRefNum;
- the_prefs_folder_dirID := 0;
- name := 'Preferences';
- oe := DirCreate(the_prefs_folder_vrn, the_prefs_folder_dirID, name, dummy);
- oe := MyGetCatInfo(the_prefs_folder_vrn, the_prefs_folder_dirID, name, 0, pb);
- if (oe = noErr) & (BAND(pb.ioFlAttrib, $10) <> 0) then begin
- the_prefs_folder_vrn := pb.ioVRefNum;
- the_prefs_folder_dirID := pb.ioDirID;
- end;
- end;
-
- { Then our folder, if any }
- our_prefs_folder_vrn := the_prefs_folder_vrn;
- our_prefs_folder_dirID := the_prefs_folder_dirID;
- if folderindex > 0 then begin
- GetIndString(name, strhId, folderindex);
- oe := DirCreate(our_prefs_folder_vrn, our_prefs_folder_dirID, name, dummy);
- oe := MyGetCatInfo(our_prefs_folder_vrn, our_prefs_folder_dirID, name, 0, pb);
- if (oe = noErr) & (BAND(pb.ioFlAttrib, $10) <> 0) then begin
- our_prefs_folder_vrn := pb.ioVRefNum;
- our_prefs_folder_dirID := pb.ioDirID;
- end;
- end;
-
- GetIndString(name, strhId, fileindex);
- oe := MyFSMakeFSSpec(our_prefs_folder_vrn, our_prefs_folder_dirID, name, prefs_fs);
-
- FixPrefType;
-
- MyGetModDate(prefs_fs, prefs_mdate);
- JustReadPrefsData;
- end;
-
- {$S Term}
- procedure FinishPreferences;
- begin
- prefs.Destroy;
- end;
-
- end.